package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"net/http"
	"os/exec"
	"strings"
	"time"
)

// 定时任务路径
const cronFilePath = "/var/spool/cron/crontabs/root"

// 读取 cron 文件中的第一个重启任务
func readFirstRebootJob() (string, error) {
	// 读取 cron 文件内容
	data, err := ioutil.ReadFile(cronFilePath)
	if err != nil {
		return "", err
	}

	// 将文件数据按行分割
	lines := strings.Split(string(data), "\n")

	// 遍历每一行，查找包含重启命令的任务
	for _, line := range lines {
		if strings.Contains(line, "/sbin/reboot") {
			return line, nil // 找到的第一个重启任务
		}
	}

	return "", nil // 如果没有找到重启任务，返回空字符串
}

// /api/get/first-reboot get请求获取第一个重启任务
func handleGetFirstRebootJob(w http.ResponseWriter, r *http.Request) {
	// 设置 CORS 响应头
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
	w.Header().Set("Access-Control-Allow-Headers", "Content-Type")

	// 读取第一个重启任务
	job, err := readFirstRebootJob()
	if err != nil {
		http.Error(w, fmt.Sprintf(`{"success": false, "msg": "%s"}`, err.Error()), http.StatusInternalServerError)
		return
	}

	currentTime := time.Now().Format("2006-01-02 15:04:05") // 获取当前本地时间的格式化字符串
	response := struct {
		Success bool   `json:"success"`
		Job     string `json:"job,omitempty"` // omitempty 使得如果 Job 为空则不返回该字段
		Time    string `json:"time"`          // 当前时间字符串
	}{
		Success: job != "", // 如果找到了任务，success 为 true
		Job:     job,
		Time:    currentTime,
	}

	// 设置响应内容类型为 JSON
	w.Header().Set("Content-Type", "application/json")
	// 发送 JSON 响应
	jsonResponse, _ := json.Marshal(response)
	w.Write(jsonResponse)
}

// 添加新的定时重启
func addRebootJob(day string, hour string, minute string) error {
	// 删除现有的 reboot 任务
	_, err := exec.Command("sh", "-c", "sed -i '/reboot/d' "+cronFilePath).Output()
	if err != nil {
		return fmt.Errorf("failed to remove existing reboot jobs: %w", err)
	}

	// 构造新的 cron 任务
	newJob := fmt.Sprintf("%s %s * * %s /sbin/reboot\n", minute, hour, day)

	// 追加新的 cron 任务
	cmd := exec.Command("sh", "-c", fmt.Sprintf("echo \"%s\" >> %s", newJob, cronFilePath))
	if err := cmd.Run(); err != nil {
		return fmt.Errorf("failed to add new reboot job: %w", err)
	}

	return nil
}

// /api/set/reboot get请求设置定时任务
func handleSetReboot(w http.ResponseWriter, r *http.Request) {
	// 设置 CORS 响应头
	w.Header().Set("Access-Control-Allow-Origin", "*")
	w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
	w.Header().Set("Access-Control-Allow-Headers", "Content-Type")

	// 处理预检请求
	if r.Method == "OPTIONS" {
		w.WriteHeader(http.StatusOK)
		return
	}

	// 获取查询参数，假设参数为 day（周几）、hour（小时）、minute（分钟）
	day := r.URL.Query().Get("day")
	hour := r.URL.Query().Get("hour")
	minute := r.URL.Query().Get("minute")

	if day == "" || hour == "" || minute == "" {
		http.Error(w, `{"success": false, "msg": "Missing parameters"}`, http.StatusBadRequest)
		return
	}

	// 添加重启任务
	if err := addRebootJob(day, hour, minute); err != nil {
		http.Error(w, fmt.Sprintf(`{"success": false, "msg": "%s"}`, err.Error()), http.StatusInternalServerError)
		return
	}

	// 成功响应
	w.Header().Set("Content-Type", "application/json")
	w.Write([]byte(`{"success": true, "msg": "Reboot job added"}`))
}
